---
id: 64df3f1011888113fbd3d81b
title: Крок 44
challengeType: 20
dashedName: step-44
---

# --description--

Щоб розв’язати головоломку за допомогою рекурсії, перше, що потрібно зробити, — розбити задачу на частини.

Щоб отримати кінцеву конфігурацію з `n` дисків, розміщених на третьому стрижні від найменшого до найбільшого, потрібно перемістити:

- `n - 1` диски від першого стрижня до допоміжного
- найбільший диск від першого стрижня до цільового
- а потім `n - 1` диски від допоміжного стрижня до цільового.

Отже, перше, що має зробити функція `move` — викликати саму себе з `n - 1` як першим аргументом. Але, якщо ви спробуєте так зробити, не визначивши базовий випадок, то отримаєте `RecursionError`. Причина в тому, що функція продовжує викликати себе нескінченно.

Додайте рекурсивний виклик функції з `n - 1` як першим аргументом перед коментарем і викликом `print()` та переконайтеся, що тіло функції виконується лише тоді, коли `n` більше нуля. Наразі залиште інші аргументи в тому ж порядку.

# --hints--

Тіло функції `move` має починатися з інструкції `if`, яка виконується, якщо `n` більше нуля.

```js
({ test: () => assert.match(code, /def\s+move\(\s*n\s*,\s*source\s*,\s*auxiliary\s*,\s*target\s*\)\s*:\s+if\s+n\s*>\s*0\s*:/) })
```

Викличте `move(n - 1, source, auxiliary, target)` в інструкції `if`. Не забудьте зробити відступи для виклику `print()`.

```js
const transformedCode = "\n" + code.replace(/\r/g, '');
const move = __helpers.python.getDef(transformedCode, "move");
const { function_parameters, function_body } = move;

assert.match(function_parameters, /n\s*,\s*source\s*,\s*auxiliary\s*,\s*target/);
const functionBodyIndent = function_body.match(/ +/)[0];
const re = new RegExp(`${functionBodyIndent}if\\s+n\\s*>\\s*0\\s*:\\s+^${functionBodyIndent}( +)move\\(\\s*n\\s*-\\s*1\\s*,\\s*source\\s*,\\s*auxiliary\\s*,\\s*target\\s*\\).+?^${functionBodyIndent}\\1print\\s*\\(\\s*rods\\s*,\\s*("|')\\\\n\\2\\s*\\)`, "ms");
assert.match(function_body, re);
```

# --seed--

## --seed-contents--

```py
NUMBER_OF_DISKS = 4
rods = {
    'A': list(range(NUMBER_OF_DISKS, 0, -1)),
    'B': [],
    'C': []
}

--fcc-editable-region--
def move(n, source, auxiliary, target):
    # display starting configuration
    print(rods, '\n')

--fcc-editable-region--
# initiate call from source A to target C with auxiliary B
move(NUMBER_OF_DISKS, 'A', 'B', 'C')
```
